Here are some sections from my items file. This is a Gen 2 dimmer:
Switch Lightwave_BathroomLights_switch “Bathroom Lights” (GroupGroundSockets, FF_Bathroom)
Dimmer Lightwave_BathroomLights_dimLevel “Bathroom Lights dimLevel” (GroupGroundLights, FF_Bathroom)
String Lightwave_BathroomLights_dimSetup "Bathroom Lights dimSetup "
Switch Lightwave_BathroomLights_protection “Bathroom Lights protection” (GroupGroundSocketsOther, FF_Bathroom)
Number Lightwave_BathroomLights_power “Bathroom Lights power [%.1f W] (Read Only)” (GroupGroundSocketsPower, FF_Bathroom)
Number Lightwave_BathroomLights_energy “Bathroom Lights energy [%.2f kWh] (Read Only)” (GroupGroundSocketsEnergy, FF_Bathroom)
String Lightwave_BathroomLights_bulbSetup "Bathroom Lights bulbSetup "
Number Lightwave_BathroomLights_Power_Cost “Bathroom Lights Power Cost [%.3f £/Hour]” (GroupGroundSocketsPowerCost, FF_Bathroom)
Number Lightwave_BathroomLights_Energy_Cost “Bathroom Lights Energy Cost [£ %.2f to date]” (GroupGroundSocketsEnergyCost, FF_Bathroom)
Switch Lightwave_BedroomLight_identify “Bedroom Light identify” (GroupGroundSocketsOther)
Switch Lightwave_BedroomLight_reset “Bedroom Light reset” (GroupGroundSocketsOther)
Switch Lightwave_BedroomLight_upgrade “Bedroom Light upgrade” (GroupGroundSocketsOther)
Number Lightwave_BedroomLight_diagnostics "Bedroom Light diagnostics "
I worked out the proper formatting and labelling for energy and power and I sorted out the icons. I’m using the item type Dimmer for the dim level as it’s easy to work with.
This is a Gen 2 socket:
Switch Lightwave_Internet_switch “Internet” (GroupGroundSockets, GF_LivingRoom)
String Lightwave_Internet_outletInUse “Internet outletInUse [%s] (Read Only)” <poweroutlet_uk> (GF_LivingRoom)
Switch Lightwave_Internet_protection “Internet protection” (GroupGroundSocketsOther, GF_LivingRoom)
Number Lightwave_Internet_power “Internet power [%.1f W] (Read Only)” (GroupGroundSocketsPower, GF_LivingRoom)
Number Lightwave_Internet_energy “Internet energy [%.2f kWh] (Read Only)” (GroupGroundSocketsEnergy, GF_LivingRoom)
Switch Lightwave_Internet_identify “Internet identify” (GroupGroundSocketsOther)
Switch Lightwave_Internet_reset “Internet reset” (GroupGroundSocketsOther)
Switch Lightwave_Internet_upgrade “Internet upgrade” (GroupGroundSocketsOther)
Number Lightwave_Internet_diagnostics "Internet diagnostics "
String Lightwave_Internet_periodOfBroadcast "Internet periodOfBroadcast "
Number Lightwave_Internet_rgbColor "Internet rgbColor "
Number Lightwave_Internet_voltage “Internet voltage [%.1f V] (Read Only)” (GF_LivingRoom)
Number Lightwave_Internet_current “Internet current [%.1f A] (Read Only)” (GF_LivingRoom)
Number Lightwave_Internet_Power_Cost “Internet Power Cost [%.3f £/Hour]” (GroupGroundSocketsPowerCost, GF_LivingRoom)
Number Lightwave_Internet_Energy_Cost “Internet Energy Cost [£ %.2f to date]” (GroupGroundSocketsEnergyCost, GF_LivingRoom)
Pesky forum now won’t let me post anymore so I’ll have to keep editing this thread and turning it into a monster (which I wanted to avoid). Ah well.
On to the rules then. First, the switch rules. When I first set it up the dimlevel rule wasn’t working so I modified it:
//Hall Lights dimLevel Rules
rule “Hall Lights dimLevel Rule” when Item Lightwave_HallLights_dimLevel received command then
var String Access_Token = Access_Token.state.toString
executeCommandLine("curl@@-g@@-XPOST@@https://publicapi.lightwaverf.com/v1/feature/5aXXXXXXXXXXXXX6-59-3157328472+0@@-H@@Content-Type: application/json@@-H@@Authorization:bearer " + Access_Token + “@@-d@@{
"value" : "” + Lightwave_HallLights_dimLevel.state.toString + “"}”,5000)
end
Refresh rule next. As I mentioned before I removed everything I don’t actually need to pull back and just kept it to the ones I specifically need to automate things and to indicate the states in the sitemap. This also reduces the load on the Pi, makes the rule run through a bit faster and reduces the logging frequency. On that subject I’m using the Pi with an external SSD but if it was just the SD card it would beat it to death to log, for example, the LinkPlus date and time because that’s different every single time it polls.
I also changed the cron for the poll to once every 30 secs. Device state changes, via the switch rule, go pretty much instantly so the polling is only to reflect the state for any further automation logic and for my mimic in the sitemap. You might want it faster but I’ve lived with 30sec for ages now and it does me fine.
On to some specifics in the refresh rule. This bit pulls the Lighwave Link Dusk (and dawn) time as a proper time and sorts out the leading zeroes to make it display properly:
//LinkPlus DuskTime
var Lightwave_LinkPlus_duskTime_Value = transform(“JSONPATH”,“$.5a6XXXXXXXXXXX8f26-10-3157328472+0”, Readme)
var int DuskTotalMinutes = Integer::parseInt(Lightwave_LinkPlus_duskTime_Value)/60
var int DuskRemainderSecs = Integer::parseInt(Lightwave_LinkPlus_duskTime_Value)%60
var int DuskTotalHours = DuskTotalMinutes/60
var int DuskRemainderMins = DuskTotalMinutes%60
var String DuskHoursPad = ‘’
var String DuskMinsPad = ‘’
var String DuskSecsPad = ‘’
if (DuskTotalHours < 10) { DuskHoursPad = ‘0’ }
if ( DuskRemainderMins < 10 ) { DuskMinsPad = ‘0’ }
if ( DuskRemainderSecs < 10 ) { DuskSecsPad = ‘0’ }
val String LinkPlus_DuskTime_String = DuskHoursPad + DuskTotalHours.toString + “:” + DuskMinsPad + DuskRemainderMins.toString + “:” + DuskSecsPad + DuskRemainderSecs.toString
Lightwave_LinkPlus_duskTime.postUpdate(LinkPlus_DuskTime_String)
Here’s some parts of the rule block for a Gen 2 socket:
// Internet Socket
var Lightwave_Internet_switch_Value = transform(“JSONPATH”,“$.5a6XXXXXXXXX98f26-32-3157328472+0”, Readme)
Lightwave_Internet_switch.postUpdate(if(Lightwave_Internet_switch_Value == “1”){ON} else if (Lightwave_Internet_switch_Value == “0”){OFF})
var Lightwave_Internet_outletInUse_Value = transform(“JSONPATH”,“$.5a6aXXXXXXXXXf98f26-33-3157328472+0”, Readme)
if (Lightwave_Internet_outletInUse_Value == “1”) {
Lightwave_Internet_outletInUse.postUpdate(“YES”)
}
else if (Lightwave_Internet_outletInUse_Value == “0”) {
Lightwave_Internet_outletInUse.postUpdate(“NO”)
}
else {
Lightwave_Internet_outletInUse.postUpdate(Lightwave_Internet_outletInUse_Value)
}
var Lightwave_Internet_protection_Value = transform(“JSONPATH”,“$.5a6XXXXXXXXX98f26-34-3157328472+0”, Readme)
Lightwave_Internet_protection.postUpdate(if(Lightwave_Internet_protection_Value == “1”){ON} else if (Lightwave_Internet_protection_Value == “0”){OFF})
var Lightwave_Internet_power_Raw = transform(“JSONPATH”,“$.5a6aXXXXXXXXXXf98f26-35-3157328472+0”, Readme)
var Lightwave_Internet_power_Value = Float::parseFloat(Lightwave_Internet_power_Raw)
Lightwave_Internet_power.postUpdate(Lightwave_Internet_power_Value)
Lightwave_Internet_Power_Cost.postUpdate(Float::parseFloat(Lightwave_Internet_power_Raw) / 1000 * Electricity_Cost)
var Lightwave_Internet_energy_Value = transform(“JSONPATH”,“$.5a6XXXXXXXXX8f26-36-3157328472+0”, Readme)
Lightwave_Internet_energy.postUpdate(Float::parseFloat(Lightwave_Internet_energy_Value) / 1000)
Lightwave_Internet_Energy_Cost.postUpdate(Float::parseFloat(Lightwave_Internet_energy_Value) / 1000 * Electricity_Cost)
var Lightwave_Internet_voltage_Raw = transform(“JSONPATH”,“$.5a6XXXXXXXXXX8f26-31-3157328472+0”, Readme)
var float Lightwave_Internet_voltage_Value = Float::parseFloat(Lightwave_Internet_voltage_Raw)/10
Lightwave_Internet_voltage.postUpdate(Lightwave_Internet_voltage_Value)
var Lightwave_Internet_current_Value = Lightwave_Internet_power_Value/Lightwave_Internet_voltage_Value
Lightwave_Internet_current.postUpdate(Lightwave_Internet_current_Value)
Here you can see I converted the 1 and 0 results for Outlet In Use to YES and NO. The way you’ve done the switch status is neater though. There’s also the modified logic to calculate the power and energy properly and I also derive the current. I’ve used similar logic for all the other devices.
In case anybody has one, here’s the code block for the energy monitor:
// Energy Monitor
var Lightwave_EnergyMonitor_power_Raw = transform(“JSONPATH”,“$.5a6XXXXXXXXXX98f26-146-3157328472+0”, Readme)
var Lightwave_EnergyMonitor_power_Value = Float::parseFloat(Lightwave_EnergyMonitor_power_Raw) / 1000
Lightwave_EnergyMonitor_power.postUpdate(Lightwave_EnergyMonitor_power_Value)
Lightwave_EnergyMonitor_Power_Cost.postUpdate(Lightwave_EnergyMonitor_power_Value * Electricity_Cost)
var Lightwave_EnergyMonitor_current_Value = Lightwave_EnergyMonitor_power_Value * 1000 / Lightwave_Internet_voltage_Value
Lightwave_EnergyMonitor_current.postUpdate(Lightwave_EnergyMonitor_current_Value)
var Lightwave_EnergyMonitor_energy_Value = transform(“JSONPATH”,“$.5a6XXXXXXXX8f26-147-3157328472+0”, Readme)
Lightwave_EnergyMonitor_energy.postUpdate(Float::parseFloat(Lightwave_EnergyMonitor_energy_Value) / 1000)
Lightwave_EnergyMonitor_Energy_Cost.postUpdate(Float::parseFloat(Lightwave_EnergyMonitor_energy_Value) / 1000 * Electricity_Cost)
var Lightwave_EnergyMonitor_rssi_Value = transform(“JSONPATH”,“$.5a6XXXXXXXXX98f26-148-3157328472+0”, Readme)
Lightwave_EnergyMonitor_rssi.postUpdate(Lightwave_EnergyMonitor_rssi_Value)
var Lightwave_EnergyMonitor_identify_Value = transform(“JSONPATH”,“$.5a6XXXXXXXXXXXf26-149-3157328472+0”, Readme)
Lightwave_EnergyMonitor_identify.postUpdate(if(Lightwave_EnergyMonitor_identify_Value == “1”){ON} else if (Lightwave_EnergyMonitor_identify_Value == “0”){OFF})
Alongside the provided rule files I also added a Timed Events rule to trigger timed events. I found my Lightwave Link sometimes choked when I hurled lots of changes at it all at once so I staggered them:
// Turn Indoor Lights ON at 19:00 (DUSK might have already done it)
rule “ON at 19:00”
when
Time cron “0 00 19 * * ?” //19:00 Daily
then
logInfo(“lightwave.rules”, “Indoor Lights ON at 19:00”)
Lightwave_GreenLamp_switch.sendCommand(ON)
Thread::sleep(3000)
Lightwave_LavaLamp_switch.sendCommand(ON)
Thread::sleep(3000)
Lightwave_WindowLights_switch.sendCommand(ON)
Thread::sleep(3000)
Lightwave_Twigs_switch.sendCommand(ON)
Thread::sleep(3000)
Lightwave_ReadingLamp_switch.sendCommand(ON)
Thread::sleep(3000)
Lightwave_HallLights_dimLevel.sendCommand(80)
Thread::sleep(3000)
Lightwave_HallLights_switch.sendCommand(ON)
sendNotification(“alandrury@gmail.com”, “Indoor Lights ON at 19:00”)
end
The sendNotification line there sends a push notification to my Android phone via the OpenHAB cloud connector. I have that for several events.
Aaaaand finally, in the same rules file, I wrote some Wakeup Light code:
// Wake Up Light
rule “Wake Up Light”
when
Time cron “0 40 06 * * ?” //Starts at 06:40 Daily, if enabled
then
if (WakeUp_Light_Alan.state == ON) {
logInfo(“lightwave.rules”, “Alan’s Wake Up Light Sequence Started”)
sendNotification(“alandrury@gmail.com”, “Alan’s Wake Up Light Sequence Started”)
val int Alan_Wakeup_StartLevel = 10
val int Alan_Wakeup_EndLevel = 81
Lightwave_BedroomLight_dimLevel.sendCommand(Alan_Wakeup_StartLevel)
Thread::sleep(3000)
Lightwave_BedroomLight_switch.sendCommand(ON)
Thread::sleep(25000)
var int ia = Alan_Wakeup_StartLevel
while ((ia=ia+1) < Alan_Wakeup_EndLevel) {
sendCommand(Lightwave_BedroomLight_dimLevel, ia)
Thread::sleep(25000)
}
sendNotification(“alandrury@gmail.com”, “Alan’s Wake Up Light Sequence Ended”)
logInfo(“lightwave.rules”, “Alan’s Wake Up Light Sequence Ended”)
}
end
If you’re still awake after all that, feel free to reuse any of the above