Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Post dine regler her!


xibriz

Anbefalte innlegg

Jeg har i det siste begynt å skrive mer og mer regler i openHAB så jeg tenkte det kunne være fint med en inspirasjonstråd/syntakshjelpetråd.

 

Her er en jeg nettopp lagde:

 

rule "Turn on evening mood"
when
        Item EveningMoodVirtual received command ON
then
        //Turn off all lights in gFirstFloor and not in gEveningMood
        gFirstFloor.members.filter[i | (!i.getGroupNames.contains("gEveningMood") && i.state != OFF)].forEach(i | i.sendCommand(OFF))
        gFirstFloor.members.filter[i | (i.getGroupNames.contains("gEveningMood") && i instanceof DimmerItem)].forEach(i | i.sendCommand(50))
end

Forklaring:

Den første linjen finner alle medlemmer i gruppen gFirstFloor og filtrerer ut alle som ikke er medlem i gruppen gEveningMood og de som allerede er av, for deretter og slå av de som gjenstår.

Den andre linjen finner alle medlemmer i gruppen gFirstFloor og filterer ut alle som er medlem i gruppen gEveningMood og som er dimbare, for så å dimme de til 50%.

  • Like 1
Lenke til kommentar
Del på andre sider

Har laget en "offline rapport" løsning på noder som ikke lenger oppdaterer seg. Dvs. jeg looper en gruppe etter items med NULL verdier (jeg setter expire på alle sensorer/målere som jeg forventer rapporterer innen viss tid **) og genererer en rapport som blir mailet.

Siden jeg bruker en lambda for å kjøre rapporten kan jeg gi den et argument med hvilke gruppe den faktisk skal sjekke, så det jeg har gjort er å lage forskjellige grupper...de som jeg forventer update innen 12timer, 6timer osv.

 

Dermed kan jeg bruke en enkel cron rule slik for å kjøre lambdaen/function (denne vil f.eks. kjøre hver 12.time og sjekke alle members i gruppen 'gTwelveHourStateCheck') :

rule "gTwelveHourStateCheck"
when
    Time cron "0 0 12 * * ?" // sjekk hver 12.time
then
    runScheduleCheck.sendCommand('gTwelveHourStateCheck')
end

 

items:

Group gReportedOfflineNodes
Group gTwelveHourStateCheck (gHourStateCheck)
Group gHourStateCheck

 

Rule:

val Functions$Function1<String,Number> runScheduleCheck = [ String scheduleGroupStringName |
    var scheduleGroup = gHourStateCheck.members.filter(n|n.name == scheduleGroupStringName).head as GroupItem
    if (scheduleGroup === null) return null
    scheduleGroup.allMembers.forEach[i|
        if (i.state === NULL) {
            if (gReportedOfflineNodes.members.filter[x|x.name == i.name].head === null) { // Sjekk om node allerede er rapportert tidligere (skal ligge i gReportedOfflineNodes)
                var msg = 'Advarsel (expire): Utløpt oppdatering fra node: ' + i.name + '.'
                logInfo('Status',msg)
                gReportedOfflineNodes.addMember(i)
            }
        }
        if ((i.state != NULL) && (gReportedOfflineNodes.members.filter[x|x.name == i.name].head !== null)) { // Fjern evt. noder som er kommet online igjen
            gReportedOfflineNodes.removeMember(i)
        }
        
    ]
    // Send rapport
    if (gReportedOfflineNodes.members.size > 0) {
        val offLineNodeString = new StringBuilder
        gReportedOfflineNodes.members.forEach[x | offLineNodeString.append("\r\n - " + x.name)]
        sendMail("me@mymail.com", "openHAB rapport over OFFLINE noder", offLineNodeString.toString)
    }
    return null
]

 

** For å sette expire på et item:

Number minTemperatur { zwave="blabla", expire="3h" }   // Dette gjør at dette item'et blir NULL etter 3 timer hvis ingen oppdatering er kommet

 

Dette kan sikkert forbedres, men fungerer greit for min del. Håper det kan hjelpe noen ;-)

Endret av Alpøy
  • Like 1
Lenke til kommentar
Del på andre sider

1 time siden, xibriz skrev:

 

Den første linjen finner alle medlemmer i gruppen gFirstFloor og filtrerer ut alle som ikke er medlem i gruppen gEveningMood og de som allerede er av, for deretter og slå av de som gjenstår.

Jeg innbiller meg at dette også kan gjøres med

gEveningMood.sendCommand(OFF)

Eller, da får eventuelt med lys som ikke er i FirstFloor også..?

Lenke til kommentar
Del på andre sider

Alpøy, den offline-warning-saken passet meg perfekt, har planlagt i noen uker å lage noe slikt, men her kom en pen løsning.

 

Kjører du OpenHAB 1.X? Min OpenHAB 2.2 klagde litt på syntax, og det virket ikke ut av boksen. Jeg endte opp med å endre Cron-regelen til

    runScheduleCheck.apply(Offlinewarning)

(hvor Offlinewarning er gruppa som alle sensorene++ ble lagt inn i) og starten av lambdaen endret jeg til

val Functions$Function1<GenericItem, String> runScheduleCheck = [ GroupItem scheduleGroup |
    if (scheduleGroup === null) return null
    scheduleGroup.members.forEach[i|

for å få det til å funke.

Lenke til kommentar
Del på andre sider

9 timer siden, berland skrev:

Jeg innbiller meg at dette også kan gjøres med


gEveningMood.sendCommand(OFF)

Eller, da får eventuelt med lys som ikke er i FirstFloor også..?

 

Se for deg at items-filen ser slik ut:

 

Group gFirstFloor
Group gEveningMood

Switch ZWLight1 "Supersterkt lys" (gFirstFloor)
Dimmer ZWLight2 "Behagelig lys" (gFirstFloor, gEveningMood)

Alle lysene er i utgangspunktet på.

 

Hvis jeg da kjører `gEveningMood.sendCommand(OFF)` får jeg motsatt effekt (jeg vil jo ha koselysene på).

Jeg kan ikke kjøre `gFirstFloor.sendCommand(OFF)` uten å kjøre `gEveningMood.sendCommand(ON)` etterpå, men det er litt unødvendig å slå av alle lysene for så å slå på de jeg vil ha på.

 

Nå er det ikke 2 lys det er snakk om, men 15 lys i `gFirstFloor` og en del lys i `gEveningMood`

Lenke til kommentar
Del på andre sider

8 timer siden, berland skrev:

Kjører du OpenHAB 1.X? Min OpenHAB 2.2 klagde litt på syntax, og det virket ikke ut av boksen.

 

Jeg måtte oppdatere syntax i noen regler når jeg oppgraderte fra 2.1 til 2.2. Det virket for meg at de var blitt litt nøyere på syntaxen.

Lenke til kommentar
Del på andre sider

8 hours ago, berland said:

Alpøy, den offline-warning-saken passet meg perfekt, har planlagt i noen uker å lage noe slikt, men her kom en pen løsning.

 

Kjører du OpenHAB 1.X? Min OpenHAB 2.2 klagde litt på syntax, og det virket ikke ut av boksen. Jeg endte opp med å endre Cron-regelen til


    runScheduleCheck.apply(Offlinewarning)

(hvor Offlinewarning er gruppa som alle sensorene++ ble lagt inn i) og starten av lambdaen endret jeg til


val Functions$Function1<GenericItem, String> runScheduleCheck = [ GroupItem scheduleGroup |
    if (scheduleGroup === null) return null
    scheduleGroup.members.forEach[i|

for å få det til å funke.

 

Jeg bruker OH2 men ser at jeg har glemt å legge til et par grupper.

For at jeg skal kunne få lambdaen til å forstå at dette var en "gruppe" (og at jeg kan bruke den i syntax) så søker jeg frem den gruppen i første linje i lambdaen (den du fjernet) (alle gruppene som skal kjøres sjekk på må være medlem av gHourStateCheck). Dette pga. jeg sender gruppenavnet som string....jeg fikk ikke til å sende gruppen som et "objekt" først mener jeg.

 

Men hvis du får det til å virke uten å passe argument som string så er intet bedre, kan du verifisere at koden virker som den skal  slik du gjorde det? :-)

 

 

 

 

Lenke til kommentar
Del på andre sider

19 minutter siden, Alpøy skrev:

Men hvis du får det til å virke uten å passe argument som string så er intet bedre, kan du verifisere at koden virker som den skal  slik du gjorde det? :-)

Ja, koden min er i "produksjon" og sendte pushover til telefonen når noen noder ble manuelt satt til NULL. Etter å ha fiklet i ørten items-filer, så burde egentlig hele systemet gått ned i dag, men fortsatt virket alt som det skulle i dag tidlig.

 

Ser nå hva jeg misforstod med gruppestrukturen, som gjorde at det ikke gikk med en gang.

  • Like 1
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.